import pandas as pd
import numpy as np

data = {'Name': ['John', 'John', 'Sona', 'Ella'],
        'score': [82, 82, 91, 87],
        'sub': ['C#', 'Python', 'Java', 'C']}
df = pd.DataFrame(data)
print(df)
# 指定分组字段

print(df.groupby('score').groups)

# 指定多个分组字段
print(df.groupby(['score', 'Name']).groups)

# 选择一个组
print(df.groupby('score').get_group(91))

for label, option_course in df.groupby('score'):
    print(label)
    print(option_course)

g = df.groupby('Name')
print(g.agg(np.mean), "---------")
print(g['score'].agg(np.mean), "-------")

df = pd.DataFrame({'种类': ['水果', '水果', '水果', '蔬菜', '蔬菜', '肉类', '肉类'],
                   '产地': ['朝鲜', '中国', '缅甸', '中国', '菲律宾', '韩国', '中国'],
                   'cage': ['org', 'aa', 'bbbb', 'c', 'd', 'fish', 'mouh'],
                   '数量': [3, 5, 5, 3, 2, 15, 9],
                   '价格': [2, 5, 12, 3, 4, 18, 20]})

print(df)
print(df.groupby('种类').sum())
print(df.groupby('种类').transform(np.mean))


# 自定义函数
# 返回分组的前n行数据
def get_rows(df, n):
    # 从1到n行的所有列
    return df.iloc[:n, :]

print(df.groupby('种类').apply(get_rows, n=3))



data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
                 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
        'Rank': [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
        'Year': [2014, 2015, 2014, 2015, 2014, 2015, 2016, 2017, 2016, 2014, 2015, 2017],
        'Points': [874, 789, 863, 663, 741, 802, 756, 788, 694, 701, 812, 698]}
df = pd.DataFrame(data)

print(df)
# 每个分组个数>4
print(df.groupby('Team').filter(lambda x: len(x) >= 4))
# 过滤
print(df['Rank'].filter(lambda x: x >= 5))
